home *** CD-ROM | disk | FTP | other *** search
-
- FCNTL(2) UNIX Programmer's Manual FCNTL(2)
-
- NNAAMMEE
- ffccnnttll - file control
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<ffccnnttll..hh>>
-
- _i_n_t
- ffccnnttll(_i_n_t _f_d, _i_n_t _c_m_d, _i_n_t _a_r_g)
-
- DDEESSCCRRIIPPTTIIOONN
- FFccnnttll() provides for control over descriptors. The argument _f_d is a de-
- scriptor to be operated on by _c_m_d as follows:
-
- F_DUPFD Return a new descriptor as follows:
-
- ++oo Lowest numbered available descriptor greater than or
- equal to _a_r_g.
- ++oo Same object references as the original descriptor.
- ++oo New descriptor shares the same file offset if the ob-
- ject was a file.
- ++oo Same access mode (read, write or read/write).
- ++oo Same file status flags (i.e., both file descriptors
- share the same file status flags).
- ++oo The close-on-exec flag associated with the new file
- descriptor is set to remain open across execv(2) sys-
- tem calls.
-
- F_GETFD Get the close-on-exec flag associated with the file descriptor
- _f_d. If the low-order bit of the returned value is 0, the file
- will remain open across eexxeecc(), otherwise the file will be
- closed upon execution of eexxeecc() (_a_r_g is ignored).
-
- F_SETFD Set the close-on-exec flag associated with _f_d to the low order
- bit of _a_r_g (0 or 1 as above).
-
- F_GETFL Get descriptor status flags, as described below (_a_r_g is ig-
- nored).
-
- F_SETFL Set descriptor status flags to _a_r_g.
-
- F_GETOWN Get the process ID or process group currently receiving SIGIO
- and SIGURG signals; process groups are returned as negative
- values (_a_r_g is ignored).
-
- F_SETOWN Set the process or process group to receive SIGIO and SIGURG
- signals; process groups are specified by supplying _a_r_g as neg-
- ative, otherwise _a_r_g is interpreted as a process ID.
-
- The flags for the F_GETFL and F_SETFL flags are as follows:
-
- O_NONBLOCK Non-blocking I/O; if no data is available to a read call, or
- if a write operation would block, the read or write call re-
- turns -1 with the error EAGAIN.
-
- O_APPEND Force each write to append at the end of file; corresponds
- to the O_APPEND flag of open(2).
-
- O_ASYNC Enable the SIGIO signal to be sent to the process group when
- I/O is possible, e.g., upon availability of data to be read.
-
- Several commands are available for doing advisory file locking; they all
-
- operate on the following structure:
-
- struct flock {
- off_t l_start; /* starting offset */
- off_t l_len; /* len = 0 means until end of file */
- pid_t l_pid; /* lock owner */
- short l_type; /* lock type: read/write, etc. */
- short l_whence; /* type of l_start */
- };
- The commands available for advisory record locking are as follows:
-
- F_GETLK Get the first lock that blocks the lock description pointed to
- by the third argument, _a_r_g, taken as a pointer to a _s_t_r_u_c_t
- _f_l_o_c_k (see above). The information retrieved overwrites the
- information passed to ffccnnttll in the _f_l_o_c_k structure. If no
- lock is found that would prevent this lock from being created,
- the structure is left unchanged by this function call except
- for the lock type which is set to F_UNLCK.
-
- F_SETLK Set or clear a file segment lock according to the lock de-
- scription pointed to by the third argument, _a_r_g, taken as a
- pointer to a _s_t_r_u_c_t _f_l_o_c_k (see above). F_SETLK is used to es-
- tablish shared (or read) locks (F_RDLCK) or exclusive (or
- write) locks, (F_WRLCK), as well as remove either type of lock
- (F_UNLCK). If a shared or exclusive lock cannot be set, ffccnnttll
- returns immediately with EACCES.
-
- F_SETLKW This command is the same as F_SETLK except that if a shared or
- exclusive lock is blocked by other locks, the process waits
- until the request can be satisfied. If a signal that is to be
- caught is received while ffccnnttll is waiting for a region, the
- ffccnnttll will be interrupted if the signal handler has not speci-
- fied the SA_RESTART (see sigaction(2)).
-
- When a shared lock has been set on a segment of a file, other processes
- can set shared locks on that segment or a portion of it. A shared lock
- prevents any other process from setting an exclusive lock on any portion
- of the protected area. A request for a shared lock fails if the file de-
- scriptor was not opened with read access.
-
- An exclusive lock prevents any other process from setting a shared lock
- or an exclusive lock on any portion of the protected area. A request for
- an exclusive lock fails if the file was not opened with write access.
-
- The value of _l___w_h_e_n_c_e is SEEK_SET, SEEK_CUR, or SEEK_END to indicate that
- the relative offset, _l___s_t_a_r_t bytes, will be measured from the start of
- the file, current position, or end of the file, respectively. The value
- of _l___l_e_n is the number of consecutive bytes to be locked. If _l___l_e_n is
- negative, the result is undefined. The _l___p_i_d field is only used with
- F_GETLK to return the process ID of the process holding a blocking lock.
- After a successful F_GETLK request, the value of _l___w_h_e_n_c_e is SEEK_SET.
-
- Locks may start and extend beyond the current end of a file, but may not
- start or extend before the beginning of the file. A lock is set to ex-
- tend to the largest possible value of the file offset for that file if
- _l___l_e_n is set to zero. If _l___w_h_e_n_c_e and _l___s_t_a_r_t point to the beginning of
- the file, and _l___l_e_n is zero, the entire file is locked. If an applica-
- tion wishes only to do entire file locking, the flock(2) system call is
- much more efficient.
-
- There is at most one type of lock set for each byte in the file. Before
- a successful return from an F_SETLK or an F_SETLKW request when the call-
- ing process has previously existing locks on bytes in the region speci-
- fied by the request, the previous lock type for each byte in the speci-
- fied region is replaced by the new lock type. As specified above under
- the descriptions of shared locks and exclusive locks, an F_SETLK or an
- F_SETLKW request fails or blocks respectively when another process has
- existing locks on bytes in the specified region and the type of any of
- those locks conflicts with the type specified in the request.
-
- This interface follows the completely stupid semantics of System V and
- IEEE Std1003.1-1988 (``POSIX'') that require that all locks associated
- with a file for a given process are removed when _a_n_y file descriptor for
- that file is closed by that process. This semantic means that applica-
- tions must be aware of any files that a subroutine library may access.
- For example if an application for updating the password file locks the
- password file database while making the update, and then calls getpw-
- name(3) to retrieve a record, the lock will be lost because getpwname(3)
- opens, reads, and closes the password database. The database close will
- release all locks that the process has associated with the database, even
- if the library routine never requested a lock on the database. Another
- minor semantic problem with this interface is that locks are not inherit-
- ed by a child process created using the fork(2) function. The flock(2)
- interface has much more rational last close semantics and allows locks to
- be inherited by child processes. Flock(2) is recommended for applica-
- tions that want to ensure the integrity of their locks when using library
- routines or wish to pass locks to their children. Note that flock(2) and
- fcntl(2) locks may be safely used concurrently.
-
- All locks associated with a file for a given process are removed when the
- process terminates.
-
- A potential for deadlock occurs if a process controlling a locked region
- is put to sleep by attempting to lock the locked region of another pro-
- cess. This implementation detects that sleeping until a locked region is
- unlocked would cause a deadlock and fails with an EDEADLK error.
-
- RREETTUURRNN VVAALLUUEESS
- Upon successful completion, the value returned depends on _c_m_d as follows:
-
- F_DUPFD A new file descriptor.
-
- F_GETFD Value of flag (only the low-order bit is defined).
-
- F_GETFL Value of flags.
-
- F_GETOWN Value of file descriptor owner.
-
- other Value other than -1.
-
- Otherwise, a value of -1 is returned and _e_r_r_n_o is set to indicate the er-
- ror.
-
- EERRRROORRSS
- FFccnnttll() will fail if:
-
- [EACCES] The argument _a_r_g is F_SETLK, the type of lock _(_l___t_y_p_e_) is a
- shared lock (F_RDLCK) or exclusive lock (F_WRLCK), and the
- segment of a file to be locked is already exclusive-locked
- by another process; or the type is an exclusive lock and
- some portion of the segment of a file to be locked is al-
- ready shared-locked or exclusive-locked by another process.
-
- [EBADF] _F_i_l_d_e_s is not a valid open file descriptor.
-
- The argument _c_m_d is F_SETLK or F_SETLKW, the type of lock
- _(_l___t_y_p_e_) is a shared lock (F_RDLCK), and _f_i_l_d_e_s is not a
- valid file descriptor open for reading.
-
- The argument _c_m_d is F_SETLK or F_SETLKW, the type of lock
- _(_l___t_y_p_e_) is an exclusive lock (F_WRLCK), and _f_i_l_d_e_s is not
-
- a valid file descriptor open for writing.
-
- [EMFILE] _C_m_d is F_DUPFD and the maximum allowed number of file de-
- scriptors are currently open.
-
- [EDEADLK] The argument _c_m_d is F_SETLKW, and a deadlock condition was
- detected.
-
- [EINTR] The argument _c_m_d is F_SETLKW, and the function was inter-
- rupted by a signal.
-
- [EINVAL] _C_m_d is F_DUPFD and _a_r_g is negative or greater than the max-
- imum allowable number (see getdtablesize(2)).
-
- The argument _c_m_d is F_GETLK, F_SETLK, or F_SETLKW and the
- data to which _a_r_g points is not valid, or _f_i_l_d_e_s refers to
- a file that does not support locking.
-
- [EMFILE] The argument _c_m_d is F_DUPED and the maximum number of file
- descriptors permitted for the process are already in use,
- or no file descriptors greater than or equal to _a_r_g are
- available.
-
- [ENOLCK] The argument _c_m_d is F_SETLK or F_SETLKW, and satisfying the
- lock or unlock request would result in the number of locked
- regions in the system exceeding a system-imposed limit.
-
- [ESRCH] _C_m_d is F_SETOWN and the process ID given as argument is not
- in use.
-
- SSEEEE AALLSSOO
- close(2), execve(2), flock(2), getdtablesize(2), open(2), sigac-
- tion(3)
-
- HHIISSTTOORRYY
- The ffccnnttll() function call appeared in 4.2BSD.
-
- 4.2 Berkeley Distribution January 12, 1994 4
-